--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/kivymd/tools/patterns/add_view.py 0.7.3 (0089bc9d) Text, 6.58 KB
T8b949e"""
The script creates a new View package
=====================================
The script creates a new View package in an existing project with an MVC
template created using the create_project utility.
.. versionadded:: 1.0.0
.. seealso::
`Utility create_project <https://kivymd.readthedocs.io/en/latest/api/kivymd/tools/patterns/create_project/>`_
.. rubric:: Use a clean architecture for your applications.
To add a new view to an existing project that was created using the
`create_project` utility, use the following command::
kivymd.add_view \\
name_pattern \\
path_to_project \\
name_view
Example command::
kivymd.add_view \\
MVC \\
/Users/macbookair/Projects \\
NewScreen
You can also add new views with responsive behavior to an existing project::
kivymd.add_view \\
MVC \\
/Users/macbookair/Projects \\
NewScreen \\
--use_responsive yes
For more information about adaptive design,
`see here <https://kivymd.readthedocs.io/en/latest/components/responsivelayout/>`_.
"""
Te6edf3__all__ Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ffmainTa5d6ff"Tb4b4b4,
Tb4b4b4]
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72from T7ee787kivy Tff7b72import Te6edf3Logger
Tff7b72from T7ee787kivymdT7ee787.T7ee787toolsT7ee787.T7ee787argument_parser Tff7b72import Te6edf3ArgumentParserWithHelp
Tff7b72from T7ee787kivymdT7ee787.T7ee787toolsT7ee787.T7ee787patternsT7ee787.T7ee787create_project Tff7b72import Tb4b4b4(
Te6edf3chek_camel_case_name_projectTb4b4b4,
Te6edf3create_common_responsive_moduleTb4b4b4,
Te6edf3create_controllerTb4b4b4,
Te6edf3create_modelTb4b4b4,
Te6edf3create_viewTb4b4b4,
Tb4b4b4)
Te6edf3screens_data Tff7b72= Ta5d6ff"""Tffd700%s
Ta5d6ffscreens = Ta5d6ff{Tffd700%s
Ta5d6ff}Ta5d6ff"""
Te6edf3screns_comment Tff7b72= Ta5d6ff"""Ta5d6ff# The screenTa5d6ff'Ta5d6ffs dictionary contains the objects of the models and controllers
Ta5d6ff# of the screens of the application.
Ta5d6ff"""
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""The function of adding a new view to the project."""
Tff7b72global Te6edf3screens_data
Te6edf3parser Tff7b72= Te6edf3create_argument_parserTb4b4b4(Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
T8b949e# pattern_name isn't used currently, will be used if new patterns is added in future
Te6edf3pattern_name Tff7b72= Te6edf3argsTff7b72.Td2a8ffpattern T8b949e# noqa F841
Te6edf3path_to_project Tff7b72= Te6edf3argsTff7b72.Td2a8ffdirectory
Te6edf3name_view Tff7b72= Te6edf3argsTff7b72.Td2a8ffname
Te6edf3use_responsive Tff7b72= Te6edf3argsTff7b72.Td2a8ffuse_responsive
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3path_to_projectTb4b4b4)Tb4b4b4:
Te6edf3parserTff7b72.Td2a8fferrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffProject <Tffd700{Te6edf3path_to_projectTffd700}Ta5d6ff> does not exist...Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3name_viewTb4b4b4[Tff7b72-T79c0ff6Tb4b4b4:Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ffScreenTa5d6ff"Tb4b4b4:
Te6edf3parserTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffThe name of the <Tffd700{Te6edf3name_viewTffd700}Ta5d6ff> screen should contain the word Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff'Ta5d6ffScreenTa5d6ff'Ta5d6ff at the end.Tffea00\nTa5d6ff"
Ta5d6ff"Ta5d6ffFor example - Ta5d6ff'Ta5d6ff--name_screen MyFirstScreen ...Ta5d6ff'Ta5d6ff"
Tb4b4b4)
Tff7b72if Te6edf3name_view Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_projectTb4b4b4, Ta5d6ff"Ta5d6ffViewTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3parserTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffThe <Tffd700{Te6edf3name_viewTffd700}Ta5d6ff> view also exists in the <Tffd700{Te6edf3path_to_projectTffd700}Ta5d6ff> project...Ta5d6ff"
Tb4b4b4)
T8b949e# Create model.
Te6edf3name_database Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffyesTa5d6ff"
Tff7b72if Ta5d6ff"Ta5d6ffdatabase.pyTa5d6ff" Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_projectTb4b4b4, Ta5d6ff"Ta5d6ffModelTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72else Ta5d6ff"Ta5d6ffnoTa5d6ff"
Tb4b4b4)
Te6edf3module_name Tff7b72= Te6edf3chek_camel_case_name_projectTb4b4b4(Te6edf3name_viewTb4b4b4)
Tff7b72if Tff7b72not Te6edf3module_nameTb4b4b4:
Te6edf3parserTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6ff"Ta5d6ffThe name of the screen should be written in camel case style. Ta5d6ff"
Ta5d6ff"Tffea00\nTa5d6ffFor example - Ta5d6ff'Ta5d6ffMyFirstScreenTa5d6ff'Ta5d6ff"
Tb4b4b4)
Te6edf3module_name Tff7b72= Ta5d6ff"Ta5d6ff_Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Te6edf3nameTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3name Tff7b72in Te6edf3module_nameTb4b4b4]Tb4b4b4)
Te6edf3path_to_project Tff7b72= Te6edf3path_to_project
Te6edf3create_modelTb4b4b4(Te6edf3name_viewTb4b4b4, Te6edf3module_nameTb4b4b4, Te6edf3name_databaseTb4b4b4, Te6edf3path_to_projectTb4b4b4)
T8b949e# Create controller.
T8b949e# FIXME: This is not a very good solution in order to understand whether
T8b949e# a project uses a hot reload or not. Because the string
T8b949e# 'from kivymd.tools.hotreload.app import MDApp' in the project can just
T8b949e# be commented out and the project does not actually use hot reload.
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_projectTb4b4b4, Ta5d6ff"Ta5d6ffmain.pyTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72as Te6edf3main_moduleTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6fffrom kivymd.tools.hotreload.app import MDAppTa5d6ff" Tff7b72in Te6edf3main_moduleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3use_hotreload Tff7b72= Ta5d6ff"Ta5d6ffyesTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3use_hotreload Tff7b72= Ta5d6ff"Ta5d6ffnoTa5d6ff"
Te6edf3create_controllerTb4b4b4(
Te6edf3name_viewTb4b4b4, Te6edf3module_nameTb4b4b4, Te6edf3use_hotreloadTb4b4b4, Te6edf3path_to_project
Tb4b4b4)
T8b949e# Create View.
Tff7b72if Te6edf3use_responsive Tff7b72== Ta5d6ff"Ta5d6ffnoTa5d6ff"Tb4b4b4:
Te6edf3create_viewTb4b4b4(Te6edf3name_viewTb4b4b4, Te6edf3module_nameTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3path_to_projectTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3create_viewTb4b4b4(Te6edf3name_viewTb4b4b4, Te6edf3module_nameTb4b4b4, Tb4b4b4[Te6edf3name_viewTb4b4b4]Tb4b4b4, Te6edf3path_to_projectTb4b4b4)
Te6edf3create_common_responsive_moduleTb4b4b4(Tb4b4b4[Te6edf3name_viewTb4b4b4]Tb4b4b4, Te6edf3path_to_projectTb4b4b4)
T8b949e# Create 'View.screens.py module'.
Te6edf3create_screens_dataTb4b4b4(Te6edf3name_viewTb4b4b4, Te6edf3module_nameTb4b4b4, Te6edf3path_to_projectTb4b4b4)
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffKivyMD: The Tffd700{Te6edf3name_viewTffd700}Ta5d6ff view has been added to the project...Ta5d6ff"
Tb4b4b4)
Tff7b72def Td2a8ffcreate_screens_dataTb4b4b4(
Te6edf3name_viewTb4b4b4: Tffa657strTb4b4b4, Te6edf3module_nameTb4b4b4: Tffa657strTb4b4b4, Te6edf3path_to_projectTb4b4b4: Tffa657str
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_projectTb4b4b4, Ta5d6ff"Ta5d6ffViewTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffscreens.pyTa5d6ff"Tb4b4b4)
Tb4b4b4) Tff7b72as Te6edf3screen_moduleTb4b4b4:
Te6edf3screen_module Tff7b72= Te6edf3screen_moduleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3imports Tff7b72= Te6edf3reTff7b72.Td2a8fffindallTb4b4b4(
Ta5d6ff"Ta5d6fffrom Model.*Model|from Controller.*ControllerTa5d6ff"Tb4b4b4, Te6edf3screen_module
Tb4b4b4)
Te6edf3screens Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3path_to_view Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_projectTb4b4b4, Ta5d6ff"Ta5d6ffViewTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3path_to_viewTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_viewTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3res Tff7b72= Te6edf3reTff7b72.Td2a8fffindallTb4b4b4(Ta5d6ff"Ta5d6ff[A-Z][a-z]*Ta5d6ff"Tb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3res Tff7b72and Tffa657lenTb4b4b4(Te6edf3resTb4b4b4) Tff7b72== T79c0ff2 Tff7b72and Te6edf3resTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffScreenTa5d6ff"Tb4b4b4:
Te6edf3screens Tff7b72+Tff7b72= Tb4b4b4(
Ta5d6ff"Tffea00\nTa5d6ff Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff: Ta5d6ff{Ta5d6ff"
Ta5d6ff"Tffea00\nTa5d6ff Ta5d6ff'Ta5d6ffmodelTa5d6ff'Ta5d6ff: Tffd700%sTa5d6ff,Ta5d6ff"
Ta5d6ff"Tffea00\nTa5d6ff Ta5d6ff'Ta5d6ffcontrollerTa5d6ff'Ta5d6ff: Tffd700%sTa5d6ff,Ta5d6ff"
Ta5d6ff"Tffea00\nTa5d6ff },Ta5d6ff"
Tff7b72% Tb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3resTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3resTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff'Tffd700{Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3resTb4b4b4)Tffd700}Ta5d6ffModelTa5d6ff'Tb4b4b4,
Ta5d6fffTa5d6ff'Tffd700{Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3resTb4b4b4)Tffd700}Ta5d6ffControllerTa5d6ff'Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Te6edf3importsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fffrom Model.Tffd700{Te6edf3module_nameTffd700}Ta5d6ff import Tffd700{Te6edf3name_viewTffd700}Ta5d6ffModelTa5d6ff"Tb4b4b4)
Te6edf3importsTff7b72.Td2a8ffappendTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6fffrom Controller.Tffd700{Te6edf3module_nameTffd700}Ta5d6ff import Tffd700{Te6edf3name_viewTffd700}Ta5d6ffControllerTa5d6ff"
Tb4b4b4)
Te6edf3importsTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3screns_commentTb4b4b4)
Te6edf3screens Tff7b72= Te6edf3screens_data Tff7b72% Tb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3importsTb4b4b4)Tb4b4b4, Te6edf3screensTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3path_to_projectTb4b4b4, Ta5d6ff"Ta5d6ffViewTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffscreens.pyTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"
Tb4b4b4) Tff7b72as Te6edf3screen_moduleTb4b4b4:
Te6edf3screen_moduleTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3screensTb4b4b4)
Tff7b72def Td2a8ffcreate_argument_parserTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3ArgumentParserWithHelpTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3ArgumentParserWithHelpTb4b4b4(
Te6edf3progTff7b72=Ta5d6ff"Ta5d6ffcreate_project.pyTa5d6ff"Tb4b4b4,
Te6edf3allow_abbrevTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ffpatternTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffthe name of the pattern with which the project will be created.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ffdirectoryTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffthe directory of the project to which you want to add a new view.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffthe name of the view to add to an existing project.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--use_responsiveTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Ta5d6ff"Ta5d6ffnoTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffwhether to create a view with responsive behavior.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3parser
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────